package org.lanqiao.tjut.db;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.lanqiao.tjut.myUtils.MyUtils;

public class DBDriver {
	/**
	 * 获取数据库连接对象
	 * 
	 * @return 数据库连接对象
	 */
	public Connection getConn() {
		// 数据连接对象--默认值null
		Connection conn = null;
		try {
			// 1、注册驱动：需要使用数据库驱动类型、数据服务器访问地址、用户名、密码
			// 读取数据库的配置文件
			InputStream is = this.getClass().getClassLoader().getResourceAsStream("db.properties");
			// 创建 java.util 包中的工具类Properties--该类用于读取Properties类型的配置文件的信息
			Properties prop = new Properties();
			// 加载被读取的文件
			prop.load(is);
			// 数据库驱动类型
			String dbDriverType = prop.getProperty("dbDriverType");
			// 数据服务器访问地址
			/*
			 * jdbc:oracle:thin:@127.0.0.1:1521:dbname
			 * 中：127.0.0.1表示数据库服务器在本机；也可以使用localhost替代；还可以 ip地址、主机名
			 * 1521是oracle客户端连接的监听端口； dbname是oracle数据库的实例名，一般默认是实例名 ORCL
			 */
			String dbURL = prop.getProperty("dbURL");
			// 用户名
			String dbUser = prop.getProperty("dbUser");
			// 密码
			String dbPSW = prop.getProperty("dbPSW");
			// 使用反射机制注册数据库服务驱动
			Class.forName(dbDriverType).newInstance();
			// 2、获取数据连接对象：connection
			conn = DriverManager.getConnection(dbURL, dbUser, dbPSW);
		} catch (Exception e) {
			// 创建数据库连接对象异常
			System.out.println("Oracle-Jdbc-创建数据库连接对象异常：");
			e.printStackTrace();
		}
		return conn;
	}

	/**
	 * 数据库查询操作
	 * 
	 * @param strSql
	 *            查询操作sql语句
	 * @return 查询结果集
	 */
	public ResultSet query(String strSql) {
		// 返回结果集
		ResultSet rs = null;
		try {
			// 3、获取数据库操作对象：statement（preparedstatement）
			Statement st = getConn().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 
					               ResultSet.CONCUR_UPDATABLE);
			// 5、执行数据操作处理
			rs = st.executeQuery(strSql);
		} catch (Exception e) {
			// 数据库查询操作异常
			System.out.println("Oracle-Jdbc-数据库查询操作异常：");
			e.printStackTrace();
		}
		return rs;
	}

	/**
	 * 数据库查询操作
	 * 
	 * @param strSql
	 *            查询操作sql语句
	 * @return 查询结果集
	 */
	public List<Map<String, Object>> queryListMap(String strSql) {
		// 返回结果集
		List<Map<String, Object>> lst = MyUtils.convertResultSet2ListMap(query(strSql));
		return lst;
	}

	/**
	 * 数据库查询操作
	 * @param <T>
	 * 
	 * @param strSql
	 *            查询操作sql语句
	 * @param beanClass
	 *            查询结果集保存使用的实体类
	 * @return 查询结果集
	 */
	public <T> List<T> queryListBean(String strSql, Class<T> beanClass) {
		// 返回结果集
		List<T> lst = MyUtils.convertResultSet2ListBean(query(strSql), beanClass);
		return lst;
	}

	/**
	 * 关闭数据库连接
	 * 
	 * @param conn
	 *            被关闭的数据连接对象
	 */
	public void closeConn(Connection conn) {
		// 7、关闭资源

		try {
			if (conn != null) {
				conn.close();
			}
		} catch (SQLException e) {
			// 数据库连接关闭异常
			System.out.println("Oracle-Jdbc-数据库连接关闭异常：");
			e.printStackTrace();
		}
	}
}
